package geradatawarehouse.dao.postgres;

import geradatawarehouse.bean.Aluno;
import geradatawarehouse.dao.postgres.abs.PostgresDAO;

import java.io.IOException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.List;

public class AlunoPostgresDAO extends PostgresDAO {

	private static final String TRUNCATE_SQL = "truncate aluno";

	protected AlunoPostgresDAO() throws IOException {
		super();
	}

	public void record(final List<Aluno> list) throws SQLException {
		final StringBuilder sb = new StringBuilder();
		sb.append("INSERT INTO aluno("
				+ "codigo, dt_nasc, nome_mae, cep, tel_mae, logradouro, endereco,"
				+ "bairro, cidade, uf, masculino, nome)" + "VALUES ");
		for (final Aluno aluno : list) {
			sb.append("('");
			sb.append(this.escape(aluno.getCodigo()));
			sb.append("', ");
			final Date dtNasc = aluno.getDtNasc();

			// Data de nascimento
			if (dtNasc != null) {
				sb.append("'");
				sb.append(this.formatDate(dtNasc));
				sb.append("'");
			} else {
				sb.append("NULL");
			}

			sb.append(", '");
			sb.append(this.escape(aluno.getNomeMae()));
			sb.append("', ");
			final Integer cep = aluno.getCep();
			sb.append(cep != null ? cep : "NULL");
			sb.append(", ");
			sb.append("'");
			sb.append(this.escape(aluno.getTelMae()));
			sb.append("'");
			sb.append(", '");
			sb.append(this.escape(aluno.getLogradouro()));
			sb.append("', '");
			sb.append(this.escape(aluno.getEndereco()));
			sb.append("', '");
			sb.append(this.escape(aluno.getBairro()));
			sb.append("', '");
			sb.append(this.escape(aluno.getCidade()));
			sb.append("', '");
			sb.append(this.escape(aluno.getUf()));
			sb.append("', ");
			final Boolean isMasculino = aluno.isMasculino();
			String masculinoString = "NULL";
			if (isMasculino != null) {
				masculinoString = isMasculino ? "TRUE" : "FALSE";
			}
			sb.append(masculinoString);
			sb.append(", '");
			sb.append(this.escape(aluno.getNome()));
			sb.append("'");

			// Fim do registro
			sb.append(")");
			sb.append("\n");

			// Próximo registro
			sb.append(", ");
		}

		String query = sb.toString();

		query = query.substring(0, query.length() - ", ".length());

		try {
			final Statement smt = this.conn.createStatement();
			smt.executeUpdate(query);
		} catch (final SQLException e) {
			this.treatTransactionException();
			throw e;
		}
	}

	public void truncateTable() throws SQLException {
		try {
			final Statement smt = this.conn.createStatement();
			smt.executeUpdate(AlunoPostgresDAO.TRUNCATE_SQL);
		} catch (final SQLException e) {
			this.treatTransactionException();
			throw e;
		}
	}
}
